TypeScript ๊ธฐ์ด: ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋์ ํ์ ์ ์จ์ผ ํ ๊น?
ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ **TypeScript(ํ์ ์คํฌ๋ฆฝํธ)**๋ ์ ํ์ด ์๋ ํ์ ๊ธฐ์ ์ด ๋์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ฐํจ์ ์ ์งํ๋ฉด์, 'ํ์ '์ด๋ผ๋ ์์ ์ฅ์น๋ฅผ ๋ํด ๋ฐํ์ ์๋ฌ๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ฌ์ฃผ๋ ํ์ ์คํฌ๋ฆฝํธ์ ํต์ฌ์ ์ ๋ฆฌํฉ๋๋ค.
1. TypeScript๋ ๋ฌด์์ธ๊ฐ?
ํ์ ์คํฌ๋ฆฝํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ **์์ ์งํฉ(Superset)**์ ๋๋ค. ์ฆ, ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋์ด๊ธฐ๋ ํ์ง๋ง, ํ์ ์คํฌ๋ฆฝํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ์ ์ ํ์ ์์คํ : ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ (์ปดํ์ผ ํ์)์ ์๋ฌ๋ฅผ ์ก์๋ ๋๋ค.
- ์ปดํ์ผ ๊ณผ์ : ๋ธ๋ผ์ฐ์ ๋ ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ์ฝ์ง ๋ชปํ๋ฏ๋ก,
tsc๋ช ๋ น์ด๋ฅผ ํตํด ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
2. ์ฃผ์ ๋ฌธ๋ฒ ๊ธฐ์ด
โ ๊ธฐ๋ณธ ํ์ ์ง์
๋ณ์๋ช
๋ค์ :์ ๋ถ์ฌ ํ์
์ ๋ช
์ํฉ๋๋ค.
let name: string = "ํ๊ธธ๋";
let age: number = 25;
let isStudent: boolean = true;
let scores: number[] = [90, 85, 100];โก ์ธํฐํ์ด์ค (Interface)
๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ฉฐ, ํ์ ์ ๋ฐ์ดํฐ ๊ท๊ฒฉ์ ๋ง์ถ๋ ๋ฐ ๋งค์ฐ ๊ฐ๋ ฅํฉ๋๋ค.
interface User {
id: number;
userName: string;
email?: string; // ?๋ ์ ํ์ ํ๋ (Optional)
}
const user: User = {
id: 1,
userName: "Alice"
};โข ์ ๋ค๋ฆญ (Generics)
ํจ์๋ ํด๋์ค๋ฅผ ๋ค์ํ ํ์ ์ ๋ํด ์ฌ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
function getFirstElement<T>(arr: T[]): T {
return arr[0];
}
const firstNum = getFirstElement([1, 2, 3]); // number๋ก ์ถ๋ก
const firstStr = getFirstElement(["a", "b"]); // string์ผ๋ก ์ถ๋ก 3. interface vs type: ๋ฌด์์ ์จ์ผ ํ ๊น?
๋น์ทํด ๋ณด์ด์ง๋ง ์ฉ๋์ ๊ธฐ๋ฅ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
โ interface (์ธํฐํ์ด์ค)
- ์ฉ๋: ์ฃผ๋ก ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํฉ๋๋ค.
- ํน์ง (์ ์ธ์ ํ์ฅ): ๋์ผํ ์ด๋ฆ์ผ๋ก ์ฌ๋ฌ ๋ฒ ์ ์ธํ๋ฉด ์๋์ผ๋ก ํฉ์ณ์ง๋๋ค(Declaration Merging). ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ ์ ํ์ฅํ ๋ ์ ๋ฆฌํฉ๋๋ค.
- ์์:
extendsํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ง๊ด์ ์ผ๋ก ์์ ๊ด๊ณ๋ฅผ ํํํฉ๋๋ค.
โก type (ํ์ ๋ณ์นญ)
- ์ฉ๋: ๊ฐ์ฒด๋ฟ๋ง ์๋๋ผ ์์๊ฐ, ์ฐ์ฐ์(
|,&), ํํ ๋ฑ ๋ชจ๋ ํ์ ์ ์ด๋ฆ์ ๋ถ์ผ ์ ์์ต๋๋ค. - ํน์ง: ํ ๋ฒ ์ ์ํ๋ฉด ํ์ฅ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค(์๋ก ์ ์ํด์ผ ํจ).
- ์กฐํฉ:
&(Intersection) ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ ํฉ์นฉ๋๋ค.
4. interface ์์(extends) ์ฌํ ์ดํดํ๊ธฐ
extends๋ ๊ธฐ์กด์ ์ ์๋ ์ธํฐํ์ด์ค์ ๋ชจ๋ ์์ฑ์ ๊ทธ๋๋ก ๋ฌผ๋ ค๋ฐ์ผ๋ฉด์ ์๋ก์ด ์์ฑ์ ์ถ๊ฐํ ๋ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ ๋
ผ๋ฆฌ์ ์ธ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ํต์ฌ ๋๊ตฌ์
๋๋ค.
โ ๊ธฐ๋ณธ ์์ (Single Inheritance)
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํํ๋ก, ๋ถ๋ชจ์ ๋ชจ๋ ์์ฑ์ ์์์ด ๊ทธ๋๋ก ๊ฐ์ง๋๋ค.
interface BasicUser {
id: string;
name: string;
}
interface PremiumUser extends BasicUser {
membershipLevel: number;
discountRate: number;
}
// PremiumUser๋ id, name, membershipLevel, discountRate 4๊ฐ์ ์์ฑ์ ๋ชจ๋ ๊ฐ์งโก ๋ค์ค ์์ (Multiple Inheritance)
TypeScript์ interface๋ ์ฌ๋ฌ ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๋์์ ์์๋ฐ์ ์ ์์ต๋๋ค. ์ด๋ ์กฐ๋ฆฝ์(Mix-in) ์คํ์ผ์ ํ์
์ค๊ณ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
interface Flyable { fly(): void; }
interface Swimmable { swim(): void; }
// ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ผํ(,)๋ก ๊ตฌ๋ถํ์ฌ ์์
interface SuperDuck extends Flyable, Swimmable {
quack(): void;
}โข ์์ฑ ์ฌ์ ์ (Overriding) ์ฃผ์์ฌํญ
์์๋ฐ์ ์์ฑ์ ํ์ ์ ๋ณ๊ฒฝํ ์ ์์ง๋ง, ๋ฐ๋์ ๋ถ๋ชจ ํ์ ๊ณผ ํธํ๋์ด์ผ ํฉ๋๋ค.
interface Product {
id: string | number;
name: string;
}
// ๋ถ๋ชจ๊ฐ string | number์ด๋ฏ๋ก, ์์์ ๋ ๊ตฌ์ฒด์ ์ธ string์ผ๋ก ์ขํ๋ ๊ฒ๋ง ๊ฐ๋ฅ
interface DigitalProduct extends Product {
id: string; // OK
}
/* ์ค๋ฅ ๋ฐ์ ์์
interface FoodProduct extends Product {
id: boolean; // Error! 'boolean'์ 'string | number'์ ํ ๋นํ ์ ์์ต๋๋ค.
}
*/5. ์ค๋ฌด์์์ ํ์ฉ ์๋๋ฆฌ์ค
์ค์ ๊ฐ๋ฐ ์์๋ ๊ณตํต ์์ฑ์ ๊ฐ์ง ๋ฒ ์ด์ค ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ณ ์ด๋ฅผ ํ์ฅํด ๋๊ฐ๋ ๋ฐฉ์์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
์๋๋ฆฌ์ค: UI ์ปดํฌ๋ํธ ๋ฐ์ดํฐ ๋ชจ๋ธ
์น ํ์ด์ง์ ์ฌ๋ฌ ์์๋ค์ด ๊ณตํต์ผ๋ก ๊ฐ๋ ์์ฑ(id, ์คํ์ผ, ํด๋ฆญ ์ด๋ฒคํธ)์ ๋ฒ ์ด์ค๋ก ์ ์ํฉ๋๋ค.
interface BaseComponent {
id: string;
className?: string;
onClick: () => void;
}
interface ButtonProps extends BaseComponent {
label: string;
color: "blue" | "red";
}
interface InputProps extends BaseComponent {
value: string;
placeholder: string;
}์ด๋ ๊ฒ ์ค๊ณํ๋ฉด ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ id์ onClick์ ๊ฐ์ ธ์ผ ํจ์ ๊ฐ์ ํ ์ ์์ด ๊ด๋ฆฌ๊ฐ ๋งค์ฐ ์ฌ์์ง๋๋ค.
6. ์ค๋ฌด ์ ํ ๊ฐ์ด๋ (Best Practice)
...
- ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ๋๋
interface๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ์ธ์. ์ฑ๋ฅ์ ์ด์ ์ด ์๊ณextends๊ฐ ๋ ์ง๊ด์ ์ ๋๋ค. - Union(
|)์ด๋ Intersection(&) ๊ฐ์ ๋ณต์กํ ํ์ ์กฐํฉ์ด ํ์ํ ๋๋type์ ์ฌ์ฉํ์ธ์. - ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์์๋ผ๋ฉด
interface๋ฅผ ์ฐ์ธ์. ์ฌ์ฉ์๊ฐ ๋์ผํ ์ด๋ฆ์ผ๋ก ํ์ ์ ํ์ฅ(Merging)ํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ๋๋ค.
6. ์ ์ฌ์ฉํด์ผ ํ ๊น? (์ฅ์ )
...
- ์๋ฌ ์๋ฐฉ: ํจ์์ ์๋ชป๋ ์ธ์๋ฅผ ๋๊ธฐ๊ฑฐ๋ ์คํ๋ฅผ ๋ด๋ฉด ์๋ฌ ๋ฉ์์ง๊ฐ ์ฆ์ ๋น๋๋ค.
- ์๋ ์์ฑ (DX): IDE๊ฐ ๊ฐ์ฒด์ ์์ฑ์ ๋ฏธ๋ฆฌ ์๊ณ ์ถ์ฒํด์ฃผ๋ฏ๋ก ๊ฐ๋ฐ ์๋๊ฐ ๋งค์ฐ ๋นจ๋ผ์ง๋๋ค.
- ๊ฐ๋ ์ฑ: ์ฝ๋๊ฐ ์์ฒด์ ์ผ๋ก ๋ฌธ์ ์ญํ ์ ํ์ฌ, ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ด ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
4. ๊ฒฐ๋ก
ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ฒ์ ๋ฐฐ์ธ ๋๋ ํ์
์ ์ ์ํ๋ ๊ณผ์ ์ด ๋ฒ๊ฑฐ๋กญ๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค. ํ์ง๋ง ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ํ์
์คํฌ๋ฆฝํธ๊ฐ ์ก์์ฃผ๋ ๋ฒ๊ทธ ํ๋ ๊ฐ๊ฐ ์ ์๊ฐ์ ๋๋ฒ๊น
์๊ฐ์ ์๊ปด์ค๋ค๋ ๊ฒ์ ์ฒด๊ฐํ๊ฒ ๋ ๊ฒ์
๋๋ค. ์ง๊ธ ๋ฐ๋ก npx tsc --init์ผ๋ก ์์ํด ๋ณด์ธ์!